<template>
  <v-container>
    <h1>查询性能的优化-少查字段</h1>
    <v-divider></v-divider>
    <h2>hibernate 有懒加载一说，但就是不好使</h2>
    <p>下面的注解加上以后没有用，还是一次都查询来了</p>
    <pre>
    @Column(name = "blog_text")
    @Basic(fetch = FetchType.LAZY)
    @LazyGroup("lobs")
    private String blogText;
    </pre>
    <h3>涉及到的类</h3>
    <p>com.zoro.dyformservice.business.blog.entity.UserBlog</p>
    <p>com.zoro.dyformservice.business.blog.repository.UserBlogRepositoryTests.testFetchLazy</p>
    <p>com.zoro.dyformservice.business.blog.repository.UserBlogRepository</p>

    <v-divider></v-divider>
    <h2>少查字段</h2>
    <h3>1.对同一个表构造新的实例</h3>
    <h3>2.使用 jpa 提供的 projections</h3>
    <p>
      projection 与 第一种方法类似，也需要创建一个新的类，区别是，projection
      对应的类都不是实体（无@Entity），不用写那么多的注解
    </p>
    <h4>基于类和record的</h4>
    <v-list lines="one" density="compact">
      <v-list-item title="这种方式是要有有且仅有一个构造方法，并且是有参的构造方法。" ></v-list-item>
      <v-list-item title="这种方式是根据构造方法的参数名字来确定sql中查询哪些字段的"></v-list-item>
    </v-list>
    <h4>基于接口的</h4>
    <v-list lines="one" density="compact">
      <v-list-item title="这种方法是通过接口定义的 get 方法来确实sql 中查询哪些字段的"></v-list-item>
      <v-list-item title="这种方式不能使用在 jpql中"></v-list-item>
    </v-list>
    <h4>动态的</h4>
    <p>向下面这样字义一个Repository 方法</p>
    <pre> &lt;T> List&lt;T> findByUserIdAndBlogTitle(String id, String title, Class&lt;T> clazz); </pre>
    可以向下面这样使用
    <pre>
        List&lt;UserBlogBasic> userBlogBasics1 = this.userBlogRepository.findByUserIdAndBlogTitle(
                "7605B49581D74506BC5ADD24B6AAAD60", "第一个测试", UserBlogBasic.class);
        List&lt;UserBlogBasicRecord> userBlogBasics2 = this.userBlogRepository.findByUserIdAndBlogTitle(
                "7605B49581D74506BC5ADD24B6AAAD60", "第一个测试", UserBlogBasicRecord.class);
        List&lt;IUserBlogBasic> userBlogBasics3 = this.userBlogRepository.findByUserIdAndBlogTitle(
                "7605B49581D74506BC5ADD24B6AAAD60", "第一个测试", IUserBlogBasic.class);
    </pre>
    <h3>涉及到的类</h3>
    <p>com.zoro.dyformservice.business.blog.entity.IUserBlogBasic</p>
    <p>com.zoro.dyformservice.business.blog.entity.UserBlogBasic</p>
    <p>com.zoro.dyformservice.business.blog.entity.UserBlogBasicRecord</p>
    <p>com.zoro.dyformservice.business.blog.repository.UserBlogRepositoryTests</p>
    <p>com.zoro.dyformservice.business.blog.repository.UserBlogRepository</p>
  </v-container>
</template>
<script setup lang="ts">
</script>

<style scoped></style>
